package top.yunp.starlingcube;

import openfl.display3D.Context3DTriangleFace;
import starling.rendering.Painter;
import starling.events.Event;
import starling.display.Image;
import starling.display.Sprite3D;
import starling.textures.Texture;
import openfl.Assets;
import starling.display.Sprite;

class FirstView extends Sprite {
	private var cube:Sprite3D;

	public function new() {
		super();

		addEventListener(Event.ADDED_TO_STAGE, addedToStageHandler);
	}

	private function addedToStageHandler(event:Event):Void {
		var bitmapData = Assets.getBitmapData("assets/girl.png");
		var texture = Texture.fromBitmapData(bitmapData);
		cube = createCube(texture);
		cube.x = stage.stageWidth / 2;
		cube.y = stage.stageHeight / 2;
		cube.z = 300;
		addChild(cube);

		addEventListener(Event.ENTER_FRAME, enterFrameHandler);
	}

	private function enterFrameHandler(event:Event):Void {
		cube.rotationX += 0.005;
		cube.rotationY += 0.005;
	}

	private function createCube(texture:Texture):Sprite3D {
		var offset:Float = texture.width / 2;

		var front:Sprite3D = createSidewall(texture);
		front.z = -offset;

		var back:Sprite3D = createSidewall(texture);
		back.rotationX = Math.PI;
		back.z = offset;

		var top:Sprite3D = createSidewall(texture);
		top.y = -offset;
		top.rotationX = Math.PI / -2.0;

		var bottom:Sprite3D = createSidewall(texture);
		bottom.y = offset;
		bottom.rotationX = Math.PI / 2.0;

		var left:Sprite3D = createSidewall(texture);
		left.x = -offset;
		left.rotationY = Math.PI / 2.0;

		var right:Sprite3D = createSidewall(texture);
		right.x = offset;
		right.rotationY = Math.PI / -2.0;

		var cube:Sprite3D = new Sprite3D();
		cube.addChild(front);
		cube.addChild(back);
		cube.addChild(top);
		cube.addChild(bottom);
		cube.addChild(left);
		cube.addChild(right);

		return cube;
	}

	private function createSidewall(texture:Texture):Sprite3D {
		var image:Image = new Image(texture);
		image.alignPivot();

		var sprite:Sprite3D = new Sprite3D();
		sprite.addChild(image);

		return sprite;
	}

	public override function render(painter:Painter):Void {
		painter.pushState();
		painter.state.culling = Context3DTriangleFace.BACK;
		super.render(painter);
		painter.popState();
	}
}
